package org.example.myleet.p1423;

public class Solution {
    /**
     * 1 ms
     * 滑窗法
     * 关键是先找到最终状态（留下连续的n-k张牌），然后将取牌的过程忽略掉，反转过来
     * 变成考虑留下连续的n-k张牌作为窗口，考虑剩余的牌总和最小
     */
    public int maxScore(int[] cardPoints, int k) {
        //卡牌总和，卡牌数，窗口大小，窗口最小和，当前窗口和
        int sum = 0, n=cardPoints.length, winLen=n-k, minWinSum, winSum=0;
        //---start---初始化过程
        for (int i=0; i<n; i++) {
            //求卡牌总和
            sum += cardPoints[i];
        }
        if (k == n) {
            //如果窗口和卡牌数相等，表示全取，直接返回结果
            return sum;
        }
        for (int i=0; i<winLen; i++) {
            //求当前窗口和
            winSum += cardPoints[i];
        }
        minWinSum = winSum;
        //---end---初始化过程结束
        for (int i=winLen; i<n; i++) {
            //滑窗
            winSum += (cardPoints[i] - cardPoints[i-winLen]);
            //考虑当前窗口是否最小
            minWinSum = Math.min(minWinSum, winSum);
        }
        //返回结果，总和减去窗口最小，即所取卡牌总点数最大
        return sum - minWinSum;
    }
}
